<?php
require_once 'settings.php';

/**
 * Az adatbázis műveletek.
 * @author repassyl
 *
 */
class DB extends mysqli {

	/**
	 * Kapcsolódik az adatbázishoz.
	 */
	public function __construct() {
		parent::__construct(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
		if (mysqli_connect_error()) {
			Log::error(mysqli_connect_errno());
		}
		$this->set_charset("utf8");
	}
}

/**
 * Authentikáció
 * @author repassyl
 */
class Auth{
	public static function modify_user_password($p1, $p2, &$t){
		if($p2 == $p1){
			$db = new DB();
			$stmt = $db->prepare("
					UPDATE
					felhasznalo
					SET
					jelszo = ?,
					titkos = 1
					WHERE felhasznalo.id = ? ;
					");
			$stmt->bind_param('si',
					$p1,
					$_SESSION['felhasznalo']['id']
			);
			$stmt->execute();
			$t->set('message', 'Az új jelszó beállítva.');
		} else {
			$t->set('message', 'A két jelszó nem egyezik!');
		}
	}

	public static function login($felhasznalonev, $jelszo, &$t) {
		$db = new DB();
		$stmt = $db->prepare("SELECT COUNT(*) AS valid FROM `felhasznalo` WHERE `felhasznalo`.`felhasznalonev` =
				? AND `felhasznalo`.`jelszo` = ?");
		$stmt->bind_param('ss', $felhasznalonev, $jelszo);
		$stmt->execute();
		$stmt->bind_result($valid);
		$stmt->fetch();
		$stmt->close();
		if($valid){
			if(!isset($_SESSION)) {
				session_start();
			}
			// Betölti a session-be a felhasználó adatait.
			$stmt = $db->prepare("SELECT * FROM `felhasznalo` WHERE `felhasznalo`.`felhasznalonev` = ? ");
			$stmt->bind_param('s', $felhasznalonev);
			$stmt->execute();
			$result = $stmt->get_result();
			$felhasznalo = $result->fetch_array();
			$stmt->close();
			$_SESSION['felhasznalo'] = $felhasznalo;
		} else {
			$t->set('message', self::why_invalid_login($felhasznalonev, $jelszo));
		}
		$db->close();
		return $valid;
	}

	/**
	 * Miért nem sikerült a bejelentkezés?
	 */
	public static function why_invalid_login($felhasznalonev, $jelszo) {
		$db = new DB();
		$stmt = $db->prepare("SELECT COUNT(felhasznalonev) AS valid FROM `felhasznalo` WHERE `felhasznalo`.`felhasznalonev` =
				? ");
		$stmt->bind_param('s', $felhasznalonev);
		$stmt->execute();
		$stmt->bind_result($valid);
		$stmt->fetch();
		$stmt->close();
		$db->close();
		return $valid ? "Rossz jelszó!" : "Rossz felhasználónév!";
	}

	/**
	 * Be van jelentkezve $csoport -beli felhasználóként.
	 * Ha a $csoport == NULL akkor csak azt vizsgálja, be van-e jelentkezve.
	 */
	public static function is_logged_in($csoport = NULL){
		if(is_null($csoport)){
			return isset($_SESSION['felhasznalo']['felhasznalonev']) && (strlen($_SESSION['felhasznalo']['felhasznalonev']) > 0);
		}
		else {
			return isset($_SESSION['felhasznalo']['csoport']) && $_SESSION['felhasznalo']['csoport'] == $csoport;
		}
	}

	public static function get_felhasznalonev(){
		return isset($_SESSION['felhasznalo']['felhasznalonev']) ? $_SESSION['felhasznalo']['felhasznalonev'] : '';
	}

	/**
	 * Kijelentkezés
	 */
	public static function logout(){
		session_destroy();
		session_id('');
		Auth::redirect('login');
	}

	/**
	 * Beállítja az URL-ben találhato session azonosítót a jelenlegi
	 * session azonosítónak.
	 */
	public static function keep_logged_in(){
		if(isset($_GET['PHPSESSID'])) {
			// beállítja a jelenlegi session ID-t
			session_id($_GET['PHPSESSID']);
		}
		session_start();
	}

	/**
	 * Átirányítja a felhasználót a $view-vel azonosított oldalra.
	 */
	public static function redirect($view){
		header("Location: " . Template::get_link($view));
		exit(0);
	}
	
	public static function modify_admin_password($j1, $j1e, $j2, $j2e, &$t){
		$message = '';
		$db = new DB();
		if($j1 == $j1e){
			if(strlen($j1) > 0) {
				$stmt = $db->prepare("
						UPDATE felhasznalo SET jelszo = ?, titkos = 1
						WHERE felhasznalo.id = ? ;
						");
				$stmt->bind_param('si',
						$j1,
						$_SESSION['felhasznalo']['id']
				);
				$stmt->execute();
				$message = 'Az új jelszó beállítva.<br />';
			}
		} else {
			$message = 'A két jelszó nem egyezik!<br />';
		}
		if($j2 == $j2e){
			if(strlen($j2) > 0) {
				$stmt = $db->prepare("
						UPDATE felhasznalo SET biztonsagijelszo = ?
						WHERE felhasznalo.id = ? ;
						");
				$stmt->bind_param('si',
						$j2,
						$_SESSION['felhasznalo']['id']
				);
				$stmt->execute();
				$message .= 'Az új biztonsági jelszó beállítva.<br />';
			}
		} else {
			$message .= 'A két biztonsági jelszó nem egyezik!<br />';
		}
		
		$t->set('message', $message);
	}
	
	public static function admin_login($jelszo, &$t) {
		$db = new DB();
		$stmt = $db->prepare("SELECT COUNT(*) AS valid FROM `felhasznalo` 
				WHERE `felhasznalo`.`felhasznalonev` = 'admin' AND 
				(`felhasznalo`.`jelszo` = ? OR `felhasznalo`.`biztonsagijelszo` = ? );");
		$biztonsagi_jelszo = $jelszo;
		$stmt->bind_param('ss', $jelszo, $biztonsagi_jelszo);
		$stmt->execute();
		$stmt->bind_result($valid);
		$stmt->fetch();
		$stmt->close();		
		if($valid){
			if(!isset($_SESSION)) {
				session_start();
			}
			// Betölti a session-be a felhasználó adatait.
			$stmt = $db->prepare("SELECT * FROM `felhasznalo` WHERE `felhasznalo`.`felhasznalonev` = 'admin' ");
			$stmt->execute();
			$result = $stmt->get_result();
			$felhasznalo = $result->fetch_array();
			$stmt->close();
			$_SESSION['felhasznalo'] = $felhasznalo;
		} else {
			$t->set('message', self::why_invalid_login('admin', $jelszo));
		}
		$db->close();
		return $valid;
	}	

}

/**
 * A view könyvtárban található templateket jeleníti meg.
 * @author repassyl
 */
class Template{

	public static $months = array(
			"01"=>"január",
			"02"=>"február",
			"03"=>"március",
			"04"=>"április",
			"05"=>"május",
			"06"=>"június",
			"07"=>"július",
			"08"=>"augusztus",
			"09"=>"szeptember",
			"10"=>"október",
			"11"=>"november",
			"12"=>"december"
	);

	/**
	 * Beállít egy template változót.
	 */
	public function set($key, $value){
		$this->param[$key] = $value;
	}

	/**
	 * Megjelenít (include-ol) egy template-t.
	 */
	public function display(){
		include('view/' . $this->param['template'] . '.php');
		exit;
	}

	/**
	 * Visszaad egy template értéket.
	 */
	public function get($key, $default = ''){
		return isset($this->param[$key]) ? $this->param[$key] : $default;
	}

	/**
	 * Kiír egy templatenek megadott változót.
	 */
	public function puts($key, $default = ''){
		echo $this->get($key, $default);
	}

	/**
	 * Előállít egy URL-t a view (~oldal) és actionnak megfelelően.
	 */
	public static function get_link($view = NULL, $action = NULL){
		$param = array();
		if(!is_null($view)) $param[] = 'view=' . $view;
		if(!is_null($action)) $param[] = 'action=' . $action;
		if(session_id()) $param[] = 'PHPSESSID=' . session_id();
		return 'index.php?' . implode('&amp;', $param);
	}

	/**
	 * Kiír egy URL-t.
	 */
	public function link($view = NULL, $action = NULL){
		echo $this->get_link($view, $action);
	}

	/**
	 * Eldönti egy menüelemről, hogy az aktuális-e.
	 */
	public function print_active($view = NULL){
		if (isset($_REQUEST["view"]) && $_REQUEST["view"] == $view) {
			echo ' class="active" ';
		}
	}
}

/**
 * A logok megjelenítését végzi attól függően, hogy teszt üzemmódban
 * van-e vagy sem.
 * @author repassyl
 */
class Log{
	public static function error($message){
		if(TEST){
			echo $message;
			exit(1);
		} else{
			// Ha nem tesztüzemmódban vagyunk, akkor csak logoljuk a hibát, nem írjuk ki.
			error_log($message);
		}
		exit(1);
	}
}

